﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Controllers;
using Interfaces;
using Utilities;

namespace Views.Moduler
{

    public partial class Diverse : UserControl
    {
        #region Fields

        private readonly Controller _controller;
        private IDiverse _selectedDiverse;
        private ISpecifikation _selectedSpecifikation;

        #endregion

        #region Creation

        public Diverse(Controller controller)
        {
            InitializeComponent();
            _controller = controller;

            OpdaterSide();
        }

        #endregion

        #region Events

        private void BtnSletEnhed_Click(object sender, RoutedEventArgs e)
        {
            var diverseEnhed = LwEnheder.SelectedItem as IDiverse;

            if (diverseEnhed == null) return;

            _selectedDiverse = diverseEnhed;

            var result = MessageBox.Show(
                "Er du sikker på at du vil slette enheden:" + _selectedDiverse.Navn +
                "? Hvis der er tilknyttet nogle udlån vil de blive slettet fra systemet.",
                "Er du sikker?", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);

            if (result == MessageBoxResult.No) return;

            _controller.FjernDiverseEnhed(_selectedDiverse);

            OpdaterSide();
        }

        private void LwEnhed_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var diverseEnhed = LwEnheder.SelectedItem as IDiverse;

            if (diverseEnhed == null) return;

            _selectedDiverse = diverseEnhed;

            EnhedValgt();

            OpdaterSpecifikationerListView();
        }

        private void BtnRedigerEnhed_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedDiverse != null)
            {
                var formular = new Form();
                formular.BtnSubmit = "Opdater";
                formular.Title = "Opdater " + _selectedDiverse.Navn;

                formular.CreateTextBox("navn", "Enhedens navn:", _selectedDiverse.Navn);
                formular.CreateIntegerBox("antal", "Total antal:", _selectedDiverse.TotalAntal.ToString());

                var window = new FormWindow(formular);
                if (window.ShowDialog() == true)
                {
                    string navn = (string) formular.Result["navn"];
                    string antal = (string) formular.Result["antal"];

                    if (navn.IsValidStringAndHasMaxLengthOf(25) &&
                        antal.IsIntegerGreaterThanZero())
                    {
                        bool opdateret = _controller.OpdaterDiverseEnhed(_selectedDiverse, navn, int.Parse(antal));
                        if (opdateret)
                        {
                            OpdaterDiverseEnhederListView();
                        }
                        else
                        {
                            MessageBox.Show("Der skete en fejl. Det kunne være fordi du har opdateret antallet, " +
                                            "til et tal der er mindre end mængden af udlån på denne enhed.",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        }

                    }
                    else
                    {
                        string validationError = "";

                        if (!navn.IsValidString())
                            validationError += "Du skal udfylde enhedens navn.\n";
                        else if (!navn.IsValidStringAndHasMaxLengthOf(25))
                            validationError += "Enhedens navn må maks være 25 tegn.\n";


                        if (!antal.IsIntegerGreaterThanZero())
                            validationError += "Antallet af enheder skal være et tal der er større end 0.\n";


                        if (!validationError.IsValidString()) return;

                        MessageBox.Show(validationError);
                    }
                }
            }
        }

        private void BtnOpretEnhed_Click(object sender, RoutedEventArgs e)
        {
            var oprettelsesDato = DateTime.Now;
            var formular = new Form();
            formular.BtnSubmit = "Tilføj enhed";
            formular.Title = "Tilføj ny enhed";

            formular.CreateTextBox("navn", "Enhedens navn:");
            formular.CreateIntegerBox("antal", "Total antal:");

            var formWindow = new FormWindow(formular);

            // hvis formularen blev submitted
            if (formWindow.ShowDialog() == true)
            {
                string navn = (string) formular.Result["navn"];
                string antal = (string) formular.Result["antal"];

                if (navn.IsValidStringAndHasMaxLengthOf(25) &&
                    antal.IsIntegerGreaterThanZero())
                {
                    bool oprettet = _controller.OpretDiverseEnhed(navn, int.Parse(antal), oprettelsesDato);
                    if (oprettet)
                    {
                        OpdaterDiverseEnhederListView();
                    }
                }
                else
                {
                    string validationError = "";

                    if (!navn.IsValidString())
                        validationError += "Du skal udfylde enhedens navn.\n";
                    else if (!navn.IsValidStringAndHasMaxLengthOf(25))
                        validationError += "Enhedens navn må maks være 25 tegn.\n";


                    if (!antal.IsIntegerGreaterThanZero())
                        validationError += "Antallet af enheder skal være et tal der er større end 0.\n";


                    if (!validationError.IsValidString()) return;

                    MessageBox.Show(validationError);
                }
            }
        }

        private void ListViewEnheder_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            VisRedigerWindow();
        }

        private void MenuItemVisUdlån_OnClick(object sender, RoutedEventArgs e)
        {
            if (_selectedDiverse == null) return;

            VisRedigerWindow();
        }

        private void BtnTilføjSpecifikation_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedDiverse == null) return;

            var formular = new Form();
            formular.BtnSubmit = "Tilføj";
            formular.Title = "Tilføj specifikation";

            formular.CreateTextBox("beskrivelse", "Beskrivelse:");

            var window = new FormWindow(formular);
            if (window.ShowDialog() == true)
            {
                string beskrivelse = (string) formular.Result["beskrivelse"];

                if (beskrivelse.IsValidString())
                {
                    bool oprettet = _controller.OpretSpecifikation(_selectedDiverse, beskrivelse);

                    if (oprettet)
                    {
                        OpdaterSpecifikationerListView();
                    }
                }
            }
        }

        private void MenuItemFjernSpecifikation_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedSpecifikation == null) return;

            var result =
                MessageBox.Show(
                    String.Format("Er du sikker på at du vil slette specifikationen: {0}",
                                  _selectedSpecifikation.Beskrivelse),
                    "Er du sikker?",
                    MessageBoxButton.YesNo,
                    MessageBoxImage.Exclamation);

            if (result == MessageBoxResult.Yes)
            {
                _controller.FjernSpecifikation(_selectedSpecifikation);
                OpdaterSpecifikationerListView();
            }
        }

        private void LwSpecifkationer_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            _selectedSpecifikation = LwSpecifkationer.SelectedItem as ISpecifikation;
            if (_selectedSpecifikation != null)
            {
                BtnFjernSpecifikation.IsEnabled = true;
            }
        }

        private void BtnVisHistorik_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedDiverse == null) return;

            var window = new EnhedsHistorik(_controller, _selectedDiverse);
            window.ShowDialog();
        }

        #endregion

        #region Tilstandsstyring

        public void OpdaterSide()
        {
            LwEnheder.SelectedItem = null;
            LwSpecifkationer.ItemsSource = null;
            LwSpecifkationer.SelectedItem = null;
            _selectedDiverse = null;
            BtnVisHistorik.IsEnabled = false;
            BtnVisUdlån.IsEnabled = false;
            BtnRediger.IsEnabled = false;
            BtnSletEnhed.IsEnabled = false;
            BtnOpretSpecifikation.IsEnabled = false;
            BtnFjernSpecifikation.IsEnabled = false;
            OpdaterDiverseEnhederListView();
            OpdaterSpecifikationerListView();
        }

        public void OpdaterSpecifikationerListView()
        {
            LwSpecifkationer.ItemsSource = _controller.HentSpecifikationerFraEnhed(_selectedDiverse);
            if (_selectedSpecifikation == null)
            {
                BtnFjernSpecifikation.IsEnabled = false;
            }

        }

        public void OpdaterDiverseEnhederListView()
        {
            LwEnheder.ItemsSource = _controller.HentAlleDiverseEnheder();
        }

        public void VisRedigerWindow()
        {
            if (_selectedDiverse == null) return;

            var brugerDiverse = new DiverseUdlån(_controller, _selectedDiverse, this);
            if (brugerDiverse.ShowDialog() == true)
            {
                OpdaterSide();
            }
        }

        public void EnhedValgt()
        {
            BtnRediger.IsEnabled = true;
            BtnSletEnhed.IsEnabled = true;
            BtnVisHistorik.IsEnabled = true;
            BtnVisUdlån.IsEnabled = true;
            BtnVisUdlån.IsDefault = true;
            BtnOpretSpecifikation.IsEnabled = true;
        }

        #endregion
    }
}
